package com.apikey.auth.repository;

import com.apikey.auth.entity.OperationHistory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;

/**
 * 操作历史数据访问接口
 * 提供操作历史的数据库操作方法
 *
 * @author API Key Framework
 * @version 1.0
 */
@Repository
public interface OperationHistoryRepository extends JpaRepository<OperationHistory, Long> {

    /**
     * 根据API Key ID查找操作历史
     *
     * @param apiKeyId API Key ID
     * @param pageable 分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByApiKeyId(Long apiKeyId, Pageable pageable);

    /**
     * 根据操作员ID查找操作历史
     *
     * @param operatorId 操作员ID
     * @param pageable   分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByOperatorId(String operatorId, Pageable pageable);

    /**
     * 根据操作类型查找操作历史
     *
     * @param operationType 操作类型
     * @param pageable      分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByOperationType(String operationType, Pageable pageable);

    /**
     * 根据API Key ID和操作类型查找操作历史
     *
     * @param apiKeyId      API Key ID
     * @param operationType 操作类型
     * @param pageable      分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByApiKeyIdAndOperationType(Long apiKeyId, String operationType, Pageable pageable);

    /**
     * 根据操作员ID和操作类型查找操作历史
     *
     * @param operatorId    操作员ID
     * @param operationType 操作类型
     * @param pageable      分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByOperatorIdAndOperationType(String operatorId, String operationType, Pageable pageable);

    /**
     * 根据时间范围查找操作历史
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pageable  分页参数
     * @return 操作历史分页列表
     */
    Page<OperationHistory> findByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);

    /**
     * 删除指定时间之前的操作历史
     *
     * @param cutoffTime 截止时间
     * @return 删除的记录数
     */
    @Modifying
    @Query("DELETE FROM OperationHistory oh WHERE oh.createdAt < :cutoffTime")
    int deleteByCreatedAtBefore(@Param("cutoffTime") LocalDateTime cutoffTime);

    /**
     * 统计指定API Key的操作次数
     *
     * @param apiKeyId API Key ID
     * @return 操作次数
     */
    long countByApiKeyId(Long apiKeyId);

    /**
     * 统计指定操作员的操作次数
     *
     * @param operatorId 操作员ID
     * @return 操作次数
     */
    long countByOperatorId(String operatorId);

    /**
     * 统计指定操作类型的操作次数
     *
     * @param operationType 操作类型
     * @return 操作次数
     */
    long countByOperationType(String operationType);

    /**
     * 统计指定时间范围内的操作次数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 操作次数
     */
    long countByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);
}